#ifndef BASEMAPPERDEF_H
#define BASEMAPPERDEF_H
#include <QObject>
#include <QMetaObject>
#include <QMetaProperty>
#include <QDebug>
/*
*[DESIGNABLE bool]    是否为主键
*[SCRIPTABLE bool]    是否为Not NULL
*[STORED bool]        是否自增
*[USER bool]          是否唯一
*/
#define PROPERTY_VALUE false
//////////////////////////////////////////////////////////////这里不能加逗号↓  //////////////
//////////////////////////////////////////////////////////////这里不能加逗号↓  //////////////
//////////////////////////////////////////////////////////////这里不能加逗号↓  //////////////重要的事说三遍
//注意在使用 这些属性的时候 不可加，              如 Q_ATTR(int,id,PRIMARY_KEY AUTO_UP) 正确用发
//Q_ATTR(int,id,PRIMARY_KEY ,AUTO_UP) 错误用发
#define PRIMARY_KEY DESIGNABLE PROPERTY_VALUE     //主键 z
#define NOT_NULL    SCRIPTABLE PROPERTY_VALUE     //不为空
#define AUTO_UP     STORED PROPERTY_VALUE     //自增
#define ONLY_VAL    USER true     //唯一值





#define UNARGS(A, ...) A ##__VA_ARGS__
/*
 * 注册一个 为T类型名字叫 menmber 的字段  T将会决定数据库中字段的类型  member 决定数据中的字段名
 *T 请使用 QT/c++ 的基本类型  可以是使用  QString
 *  eg Q_ATTR(int ,id)  注册一个 id 字段
*/

#define Q_ATTR(T,member,...) \
Q_PROPERTY(T member READ get##member WRITE set##member __VA_ARGS__) \
public: \
    Q_INVOKABLE T get##member() { return member;} \
    Q_INVOKABLE void set##member(T t) {member = t;} \
    Q_INVOKABLE const char* __getretrunname__##member() { return #T;} \
    T member = 0;


/*
 *  因为QObject 删除了拷贝构造函数 我们需要重写拷贝构造 也可以不用这个宏 自己重写
 */

#define COPY_CONSTRUCT(CLASSNAME)\
public:\
CLASSNAME(){}\
CLASSNAME(const CLASSNAME &t){\
    const QMetaObject *metaObj =t.metaObject();\
    int propertyCount = metaObj->propertyCount() ;\
    for(int i = 0 ; i < propertyCount ;i++)\
    {\
        QMetaProperty p = metaObj->property(i);\
        if(memcmp( p.name() ,"objectName",10) ==0)\
        {            continue;        }\
        this->setProperty(p.name(),t.property(p.name()));\
    }\
}

#define OUT_STREAM(Class)\
friend QDebug operator <<(QDebug deg,const Class & obj)\
{\
    const QMetaObject *metaObj =obj.metaObject();\
    int propertyCount = metaObj->propertyCount() ;\
    QString beanJson ="{";\
    for(int i = 0 ; i < propertyCount ;i++)\
    {\
        QMetaProperty p = metaObj->property(i);\
        if(memcmp( p.name() ,"objectName",10) ==0)\
        {            continue;        }\
        beanJson +=QString("%1:%2 ").arg(p.name(),obj.property(p.name()).toString());\
        if(i != propertyCount -1)  {beanJson+=",";} \
    }\
    deg<<beanJson <<"}";\
    return deg;\
}




#endif // BASEMAPPERDEF_H
